package com.test.design.pattern.singleton.demo5;

/**
 * @ClasName Singleton
 * @Descripution TODO  懒汉式-方式3（双重检查锁）
 * @Author leikw
 * @Date 2021/11/1 9:01
 * @Version V1.0
 */
public class Singleton {

    private Singleton(){};

    private static Singleton singleton;

    public static Singleton getInstance(){
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }

        return singleton;
    }

//双重检查锁模式是一种非常好的单例实现模式，解决了单例、性能、线程安全问题，上面的双重检
//测锁模式看上去完美无缺，其实是存在问题，在多线程的情况下，可能会出现空指针问题，出现问
//题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。
//要解决双重检查锁模式带来空指针异常的问题，只需要使用 volatile 关键字, volatile 关
//键字可以保证可见性和有序性。

}
